/*
提交链接：https://leetcode.cn/problems/minimum-size-subarray-sum/submissions/560389345
209. 长度最小的子数组-中等
完成日期：2024/9/1
滑动窗口
*/

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();  // 数组的大小
        int min_len = n + 1;  // 初始化最小长度为一个比数组长度大的值
        int sum = 0;  // 当前窗口内的和
        int left = 0;  // 窗口的左边界
        // 使用右指针扩展窗口
        for (int right = 0; right <n; ++right) {
            sum += nums[right];  // 将当前元素加入到窗口和中
            // 当窗口和大于等于目标值时，尝试缩小窗口
            while (sum >= target) {
                min_len = min(min_len, right - left + 1);  // 更新最小长度
                sum -= nums[left];  // 从窗口和中移除左边界的元素
                ++left;  // 移动左边界
            }
        }
        // 如果最小长度没有更新，返回 0；否则返回最小长度
        return min_len == n + 1 ? 0 : min_len;
    }
};
